﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Windows.Forms;
using System.Diagnostics;

namespace Cataloger
{
    /// <summary>
    /// Abstrakcyjna klasa okreslajaca obiekt dyskowy (Plik, Folder)
    /// Stworzona ze względu na fakt, iż Pliki i Foldery mają dużo wspólnych właściwości
    /// pól oraz metod, i sensownym wydawało się stworzenie dobrego szkieletu do rozszerzania
    /// dla Pliku i Folderu
    /// </summary>
    [Serializable]
    public abstract class ObiektDyskowy :IInfo, IUruchom,IObiektCatalogera
    {
		#region Fields (7) 

        /// <summary>
        /// Atrybuty pliku takie jak: ReadOnly, Hidden etc.
        /// </summary>
        protected FileAttributes atrybuty;
        protected DateTime dataDost;
        protected DateTime dataMod;
        protected DateTime dataUtw;
        /// <summary>
        /// Obiekt posiada dodatkowe informacje w opisie
        /// </summary>
        protected bool dodatkoweInfo;
        protected string nazwa;
        /// <summary>
        /// Rozmiar obiektu w bajtach
        /// </summary>
        protected long rozmiar;

		#endregion Fields 

		#region Properties (18) 

        /// <summary>
        /// Atrybuty pliku takie jak ReadOnly, Hidden etc.
        /// </summary>
        public FileAttributes Atrybuty
        {
            get
            {
                return this.atrybuty;
            }

        }
        //public string Atrybuty
        //{
        //    get
        //    {
        //        StringBuilder atrybut = new StringBuilder();

        //        if (this.atrybuty == FileAttributes.Archive)
        //        {
        //            atrybut.Append("A");
        //        }
        //        if (this.atrybuty == FileAttributes.Compressed)
        //        {
        //            atrybut.Append("C");
        //        }
        //        if (this.atrybuty == FileAttributes.Directory)
        //        {
        //            atrybut.Append("D");
        //        }
        //        if (this.atrybuty == FileAttributes.Hidden)
        //        {
        //            atrybut.Append("H");
        //        }
        //        if (this.atrybuty == FileAttributes.ReadOnly)
        //        {
        //            atrybut.Append("R");
        //        }
        //        if (this.atrybuty == FileAttributes.System)
        //        {
        //            atrybut.Append("S");
        //        }
        //        if (this.atrybuty == FileAttributes.Temporary)
        //        {
        //            atrybut.Append("T");
        //        }

        //        return atrybut.ToString();
        //    }

        //}

        public abstract bool CzyIstniejeSciezka
        {
            get;
        }

        /// <summary>
        /// Ostatni dostęp do obiektu
        /// </summary>
        public DateTime DataDost
        {
            get { return dataDost; }
        }

        /// <summary>
        /// Data ostatniej modyfikacji obiektu
        /// </summary>
        public DateTime DataMod
        {
            get { return dataMod; }
        }

        /// <summary>
        /// Data utworzenia obiektu
        /// </summary>
        public DateTime DataUtw
        {
            get { return dataUtw; }
        }

        /// <summary>
        /// Katalog w którym znajduje się dany obiekt dyskowy
        /// </summary>
        public Katalog KataloG
        {
            get
            {
                return this.Nosnik.Katalog;
            }
        }

        /// <summary>
        /// Nazwa obiektu dyskowego z rozszerzeniem np. plik.rar dla folderu np. Domowy
        /// </summary>
        public string Nazwa
        {
            get { return nazwa; }
        }

        /// <summary>
        /// Nazwa wprowadzona przez uzytkownika dla latwiejszego spojrzenia na dane
        /// </summary>
        public string NazwaAlias
        {
            get;
            set;
        }

        /// <summary>
        /// Nosnik na którym znajduje się dany obiekt dyskowy
        /// </summary>
        public abstract Nosnik Nosnik
        {
            get;
        }

        /// <summary>
        /// Opis obiektu
        /// </summary>
        public string Opis
        {
            get;
            set;
        }

        public abstract string OpisStatusStrip
        {
            get;
        }

        /// <summary>
        /// Folder w którym znajduje się dany obiekt dyskowy
        /// </summary>
        public Folder Rodzic
        {
            get;
            set;
        }

        abstract public long Rozmiar
        {
            get;
        }

        abstract public string Sciezka
        {
            get;
        }

        public abstract string SciezkaKatalogu
        {
            get;
        }

        public string SciezkaRzeczyiwsta
        {
            get
            {
                return Path.Combine(Nosnik.NazwaNapedu().Name.Substring(0, 3), this.Sciezka.Substring(3));
            }
        }

        public abstract string Typ
        {
            get;
        }

		#endregion Properties 

		#region Methods (5) 

		// Public Methods (5) 

        public string GetSciezka(Folder ob)
        {
            if (ob.GetType() == typeof(Cataloger.StrukturaDanych.FolderRoot))
            {
                return ob.Nazwa;
            }
            else
            {
                return Path.Combine(GetSciezka(ob.Rodzic), ob.Nazwa);
            }
        }

        public override string ToString()
        {
            return this.Nazwa;
        }

        public abstract  void Uruchom();

        public abstract  void UruchomFolder();

		#endregion Methods 



        #region IInfo Members

        public abstract string OpisWlasciwosci
        {
            get;
        }

        public abstract string OpisToolTip
        {
            get;
        }

        #endregion

        #region IObiektCatalogera Members


        public virtual Kategoria Kategoria
        {
            get;
            set;
        }

        #endregion

        #region ILokalizacja Members

        public string SciezkaWKatalogu
        {
            get { return SciezkaKatalogu; }
        }

        #endregion
    }
}
